/**
             * 将base64图片逆时针旋转90度
             * 使用Canvas API进行图片处理，兼容H5和微信小程序
             */
export async function rotateImage(oldbase64, that) {
    console.log('开始旋转图片...');
    let resultbase64 = null
    // #ifdef H5
    // H5环境使用标准Canvas API
    console.log('使用H5 Canvas API');
    resultbase64 = await rotateImageH5(oldbase64)
    return resultbase64
    // #endif

    // #ifdef MP-WEIXIN
    // 微信小程序环境，直接使用简化方法
    console.log('使用微信小程序Canvas API');
    resultbase64 = await rotateImageWXSimple(oldbase64, that)
    return resultbase64
    // #endif
}

/**
 * H5环境下的图片旋转处理
 */
export function rotateImageH5(oldbase64) {
    return new Promise((rs) => {
        const img = new Image();
        img.crossOrigin = 'anonymous'; // 处理跨域问题

        img.onload = () => {
            console.log('H5开始处理图片旋转...');

            // 原始图片尺寸 (x×y)
            const originalWidth = img.width;   // x
            const originalHeight = img.height; // y

            console.log(`原始图片尺寸: ${originalWidth}×${originalHeight}`);

            // 创建canvas元素
            const canvas = document.createElement('canvas');
            const ctx = canvas.getContext('2d');

            // 旋转后canvas尺寸需要交换宽高 (y×x)
            const rotatedWidth = originalHeight;  // 新宽度 = 原高度 (y)
            const rotatedHeight = originalWidth;  // 新高度 = 原宽度 (x)

            canvas.width = rotatedWidth;
            canvas.height = rotatedHeight;

            console.log(`旋转后图片尺寸: ${rotatedWidth}×${rotatedHeight}`);

            // 设置白色背景
            ctx.fillStyle = '#FFFFFF';
            ctx.fillRect(0, 0, canvas.width, canvas.height);

            // 设置旋转中心点并旋转
            ctx.save();
            ctx.translate(canvas.width / 2, canvas.height / 2);
            ctx.rotate(-Math.PI / 2); // 逆时针旋转90度

            // 绘制图片（注意坐标偏移）
            ctx.drawImage(img, -originalWidth / 2, -originalHeight / 2, originalWidth, originalHeight);
            ctx.restore();

            const newbase64 = canvas.toDataURL('image/png');
            console.log('H5图片旋转完成');
            rs(newbase64)
            // 获取旋转后的base64数据

        };

        img.onerror = (err) => {
            console.error('H5图片加载失败:', err);
            rs(null)
        };

        img.src = oldbase64;
    })

}

/**
 * 微信小程序简化处理方法
 * 先通过H5方式获取图片真实尺寸，然后进行旋转处理
 */
export function rotateImageWXSimple(oldbase64, that) {
    return new Promise(rs => {
        console.log('微信小程序开始处理图片旋转...');

        // 使用临时Image对象获取图片真实尺寸
        // #ifdef H5
        const tempImg = new Image();
        tempImg.onload = () => {
            doWXRotation(tempImg.width, tempImg.height, oldbase64, that).then(newbase64 => {
                rs(newbase64)
            })
        };
        tempImg.src = oldbase64;
        // #endif

        // #ifdef MP-WEIXIN
        // 微信小程序环境，使用固定尺寸或尝试获取
        doWXRotation(tempImg.width, tempImg.height, oldbase64, that).then(newbase64 => {
            rs(newbase64)
        })
        // #endif
    })
}

/**
 * 执行微信小程序的图片旋转处理（修复版本）
 * @param {number} originalWidth 原始图片宽度 (x)  
 * @param {number} originalHeight 原始图片高度 (y)
 */
export function doWXRotation(originalWidth, originalHeight, oldbase64, that) {
    return new Promise(rs => {
        const canvasId = 'rotateCanvasLegacy';

        console.log(`开始旋转图片，原始尺寸: ${originalWidth}×${originalHeight}`);

        // 旋转后的canvas尺寸 (y×x)
        const rotatedWidth = originalHeight;   // 新的宽度 = 原始高度
        const rotatedHeight = originalWidth;   // 新的高度 = 原始宽度

        console.log(`旋转后尺寸应为: ${rotatedWidth}×${rotatedHeight}`);

        // 设置Canvas样式，确保有足够的空间
        that.canvasStyle = `width: ${rotatedWidth}px; height: ${rotatedHeight}px;`;

        // 创建canvas上下文  
        const ctx = uni.createCanvasContext(canvasId, that);

        // 获取设备像素比，确保高清显示
        const pixelRatio = uni.getSystemInfoSync().pixelRatio || 1;
        console.log(`设备像素比: ${pixelRatio}`);

        // 设置背景色（白色）- 使用逻辑尺寸
        ctx.fillStyle = '#FFFFFF';
        ctx.fillRect(0, 0, rotatedWidth, rotatedHeight);

        // 设置旋转变换
        ctx.save();
        // 移动到新canvas的中心点
        ctx.translate(rotatedWidth / 2, rotatedHeight / 2);
        // 逆时针旋转90度
        ctx.rotate(-Math.PI / 2);

        // 绘制原始图片（以原始图片的中心为基准）
        ctx.drawImage(oldbase64, -originalWidth / 2, -originalHeight / 2, originalWidth, originalHeight);
        ctx.restore();

        // 执行绘制
        ctx.draw(false, () => {
            console.log('Canvas绘制完成，开始导出...');
            // 延时确保绘制完成
            setTimeout(() => {
                uni.canvasToTempFilePath({
                    canvasId: canvasId,
                    x: 0,
                    y: 0,
                    width: rotatedWidth,        // 使用逻辑尺寸，让系统自动处理像素比
                    height: rotatedHeight,      // 使用逻辑尺寸，让系统自动处理像素比
                    destWidth: rotatedWidth * pixelRatio,    // 输出高清尺寸
                    destHeight: rotatedHeight * pixelRatio,  // 输出高清尺寸
                    fileType: 'png',
                    quality: 1.0, // 最高质量
                    success: (canvasRes) => {
                        console.log(`Canvas导出成功: ${canvasRes.tempFilePath}`);
                        console.log(`最终图片尺寸: ${rotatedWidth * pixelRatio}×${rotatedHeight * pixelRatio}`);

                        // 转换为base64格式，确保完整显示
                        uni.getFileSystemManager().readFile({
                            filePath: canvasRes.tempFilePath,
                            encoding: 'base64',
                            success: (fileRes) => {
                                const newbase64 = 'data:image/png;base64,' + fileRes.data;
                                rs(newbase64)
                            },
                            fail: (err) => {
                                console.error('读取文件失败:', err);
                                // 降级使用临时文件路径
                                const newbase64 = canvasRes.tempFilePath;
                                rs(newbase64)
                            }
                        });
                    },
                    fail: (err) => {
                        console.error('canvas转图片失败:', err);
                        rs(null)
                    },
                    // 坑：complete比success先执行，会先rs出去。所以complete尽量不要做rs
                    // complete: () => {
                    //     rs(null)
                    // }
                }, that);
            }, 500); // 减少延时，优化用户体验
        });
    })
}